package com.frame.redis;

import com.frame.para.ParametersUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

import java.util.*;
import java.util.concurrent.TimeUnit;

@Component
public class StringRedisUtil {


    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private JedisPool pool;
    
    


    /**
     * 操作hash
     *
     * @author Flying
     * 2018年1月11日 下午5:03:43
     */
    private HashOperations<String, String, String> getHashOperations() {
        return stringRedisTemplate.opsForHash();//操作hash
    }

    /**
     * 操作字符串
     *
     * @return
     * @author Flying
     * 2018年1月11日 下午5:03:53
     */
    private ValueOperations<String, String> getStringalueOperations() {
        return stringRedisTemplate.opsForValue();//操作字符串
    }

    /**
     * 操作list
     *
     * @return
     * @author Flying
     * 2018年1月11日 下午5:04:01
     */
    private ListOperations<String, String> getListOperations() {
        return stringRedisTemplate.opsForList();//操作list
    }

    /**
     * 操作set
     *
     * @return
     * @author Flying
     * 2018年1月11日 下午5:04:15
     */
    private SetOperations<String, String> getSetOperations() {
        return stringRedisTemplate.opsForSet();//操作set

    }

    /**
     * 操作有序set
     *
     * @return
     * @author Flying
     * 2018年1月11日 下午5:04:21
     */
    private ZSetOperations<String, String> getZSetOperations() {
        return stringRedisTemplate.opsForZSet();//操作有序set

    }

    /*****************************************************
     ***********************Hash**************************
     *****************************************************/
    /**
     * 通过key批量清空Hash中的值
     *
     * @param group
     * @param keys
     * @return
     * @author Flying
     * 2018年1月11日 下午5:25:33
     */
    public Long delete(String group, Object... keys) {
        return getHashOperations().delete(group, keys);
    }

    /**
     * Hash中的key是否存在
     *
     * @param group
     * @param key
     * @return
     * @author Flying
     * 2018年1月11日 下午5:27:53
     */
    public Boolean hasStringey(String group, Object key) {
        return getHashOperations().hasKey(group, key);
    }

    /**
     * 通过键获取Hash中的值
     *
     * @param group
     * @param key
     * @return
     * @author Flying
     * 2018年1月11日 下午5:28:32
     */
    public String get(String group, Object key) {
        return getHashOperations().get(group, key);
    }

    /**
     * 通过key批量获取值
     *
     * @param group
     * @param keys
     * @return
     * @author Flying
     * 2018年1月11日 下午5:29:03
     */
    public List<String> multiGet(String group, String... keys) {
        return getHashOperations().multiGet(group, Arrays.asList(keys));
    }

    public List<String> multiGet(String group, Collection<String> keys) {
        return getHashOperations().multiGet(group, keys);
    }



    /**
     * 给Hash中的值递增
     *
     * @param group
     * @param key
     * @param delta
     * @return
     * @author Flying
     * 2018年1月11日 下午5:33:01
     */
    public Long increment(String group, String key, long delta) {
        return getHashOperations().increment(group, key, delta);
    }

    /**
     * 给Hash中的值递增
     *
     * @param group
     * @param key
     * @param delta
     * @return
     * @author Flying
     * 2018年1月11日 下午5:34:02
     */
    public Double increment(String group, String key, double delta) {
        return getHashOperations().increment(group, key, delta);
    }

    /**
     * 获取hash中的所有key
     *
     * @param group
     * @return
     * @author Flying
     * 2018年1月11日 下午5:34:09
     */
    public Set<String> keys(String group) {
        try (Jedis jedis = pool.getResource()){
            return jedis.keys(group);
        }
//        return getHashOperations().keys(group);

    }

    /**
     * 获取hash的总数量
     *
     * @param group
     * @return
     * @author Flying
     * 2018年1月11日 下午5:34:53
     */
    public Long hashSize(String group) {
        return getHashOperations().size(group);
    }

    /**
     * 缓存HashmMap
     *
     * @param group
     * @param m
     * @author Flying
     * 2018年1月11日 下午6:04:37
     */
    public void putAll(String group, Map<String, String> m) {
        getHashOperations().putAll(group, m);

    }

    /**
     * 缓存Hash值
     *
     * @param group
     * @param key
     * @param value
     * @author Flying
     * 2018年1月11日 下午6:05:07
     */
    public void put(String group, String key, String value) {
        getHashOperations().put(group, key, value);
    }

    /**
     * 通过Hash给key设置指定的值,如果key不存在则先创建,如果key已经存在,返回0
     *
     * @param group
     * @param key
     * @param value
     * @return
     * @author Flying
     * 2018年1月11日 下午6:09:27
     */
    public Boolean putIfAbsent(String group, String key, String value) {
        return getHashOperations().putIfAbsent(group, key, value);
    }

    /**
     * 获取Hash value集合
     *
     * @param group
     * @return
     * @author Flying
     * 2018年1月11日 下午6:10:25
     */
    public List<String> values(String group) {
        return getHashOperations().values(group);
    }

    /**
     * 通过Hash获取所有的key和value
     *
     * @param group
     * @return
     * @author Flying
     * 2018年1月11日 下午6:11:47
     */
    public Map<String, String> entries(String group) {
        return getHashOperations().entries(group);
    }


    /*****************************************************
     ***********************String**************************
     *****************************************************/

    /**
     * 添加redis缓存
     *
     * @param key
     * @param value
     * @author Flying
     * 2018年1月12日 上午8:38:00
     */
    public void set(String key, String value) {
        getStringalueOperations().set(key, value);
    }


    /**
     * 添加redis缓存 并设置过期时间 (以秒为单位)
     *
     * @param key
     * @param value
     * @param seconds
     * @param seconds
     * @author Flying
     * 2018年1月12日 上午8:40:22
     */
    public void set(String key, String value, int seconds) {
        getStringalueOperations().set(key, value, seconds, TimeUnit.SECONDS);
    }

    /**
     * description:添加redis缓存 并设置过期时间 (以天为单位)
     * @author: dove king
     * @date: 9:43 2018/4/10
     * @param:[key, value, days]
     * @return void
     */
    public void setDay(String key, String value, int days) {
        getStringalueOperations().set(key, value, days, TimeUnit.DAYS);
    }

    /**
     * <p>
     * 设置key value,如果key已经存在则返回false,nx==> not exist
     * </p>
     *
     * @param key
     * @param value
     * @return 成功返回true 如果存在 和 发生异常 返回 false
     */
    public Boolean setIfAbsent(String key, String value) {
        return getStringalueOperations().setIfAbsent(key, value);
    }

    /**
     * 批量插入缓存数据
     *
     * @param map
     * @author Flying
     * 2018年1月12日 上午8:56:42
     */
    public void multiSet(Map<String, String> map) {
        getStringalueOperations().multiSet(map);
    }

    /**
     * 批量设置key value,如果key已经存在则返回false,nx==> not exist
     *
     * @param map
     * @return
     * @author Flying
     * 2018年1月12日 上午8:57:08
     */
    public Boolean multiSetIfAbsent(Map<String, String> map) {
        return getStringalueOperations().multiSetIfAbsent(map);
    }




    /**
     * 设置key的值,并返回一个旧值
     *
     * @param key
     * @param value
     * @return
     * @author Flying
     * 2018年1月12日 上午8:58:41
     */
    public String getAndSet(String key, String value) {
        return getStringalueOperations().getAndSet(key, value);
    }

    /**
     * 通过批量的key获取批量的value
     *
     * @param keys
     * @return
     * @author Flying
     * 2018年1月12日 上午8:59:21
     */
    public List<String> multiGet(String... keys) {
        return getStringalueOperations().multiGet(Arrays.asList(keys));
    }

    public List<String> multiGet(Collection<String> keys) {
        return getStringalueOperations().multiGet(keys);
    }


    /**
     * 通过key给指定的value加值,如果key不存在,则这是value为该值
     *
     * @param key
     * @param delta
     * @return
     * @author Flying
     * 2018年1月12日 上午9:00:00
     */
    public Long increment(String key, long delta) {
        if (exists(key)) {
            return getStringalueOperations().increment(key, delta);
        } else {
            getStringalueOperations().set(key, String.valueOf(delta));
            return 1L;
        }
    }

    /**
     * 通过key给指定的value加值,如果key不存在,则这是value为该值
     *
     * @param key
     * @param delta
     * @return
     * @author Flying
     * 2018年1月12日 上午9:00:04
     */
    public Double increment(String key, double delta) {
        if (exists(key)) {
            return getStringalueOperations().increment(key, delta);
        } else {
            getStringalueOperations().set(key, String.valueOf(delta));
            return 1D;
        }
    }

    /**
     * 通过key向指定的value值追加值
     *
     * @param key
     * @param value
     * @return
     * @author Flying
     * 2018年1月12日 上午9:00:22
     */
    public Integer append(String key, String value) {
        return getStringalueOperations().append(key, value);
    }

    /**
     * 通过下标 和key 获取指定下标位置的 value
     *
     * @param key
     * @param start
     * @param end
     * @return
     * @author Flying
     * 2018年1月12日 上午9:00:50
     */
    public String get(String key, long start, long end) {
        return getStringalueOperations().get(key, start, end);
    }

    /**
     * 通过key 和offset 从指定的位置开始将原先value替换
     *
     * @param key
     * @param value
     * @param offset
     * @author Flying
     * 2018年1月12日 上午9:12:20
     */
    public void set(String key, String value, long offset) {
        getStringalueOperations().set(key, value, offset);
    }

    /**
     * 获取值长度
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午9:13:26
     */
    public Long valuelen(String key) {
        return getStringalueOperations().size(key);
    }

    /*****************************************************
     ***********************String**************************
     *****************************************************/

    public List<String> scanMatch(String key) {
        List<String> resultList = new ArrayList<>();
        try (Jedis jedis = pool.getResource()) {
            int newCursor = 0;
            do {
                ScanParams scanParams = new ScanParams();
                scanParams.match(key);
                ScanResult<String> scanResult = jedis.scan(String.valueOf(newCursor), scanParams);
                newCursor = Integer.parseInt(scanResult.getStringCursor());
                resultList.addAll(scanResult.getResult());
            } while (newCursor > 0);

            return resultList;
        }
    }

    /*****************************************************
     ***********************List**************************
     *****************************************************/

    /**
     * description: 插入队列
     * @author: dongpeng
     * @param: key
     * @param: redPackets
     * @param: index
     * @return:
     */
    public void addRedPacketQueue(String key, List<String> redPackets,Integer index) {
        List<String> batch = new ArrayList<>();
        try (Jedis jedis = pool.getResource()){
            select(jedis, index);
            for (int i = 0; i < redPackets.size(); i++) {
                batch.add(redPackets.get(i));
                if (i % 10000 == 9999) {
                    String [] strArr = new String[10000];
                    jedis.lpush(key, batch.toArray(strArr));
                    batch.clear();
                }
            }
            if (batch.size() > 0) {
                String [] strArr = new String[batch.size()];
                jedis.lpush(key, batch.toArray(strArr));
            }
        }

    }

    /**
     * 通过key获取list指定下标位置的value
     *
     * @param key
     * @param start
     * @param end
     * @return
     * @author Flying
     * 2018年1月12日 上午9:50:06
     */
    public List<String> range(String key, long start, long end) {
        return getListOperations().range(key, start, end);
    }

    /**
     * 通过key保留list中从strat下标开始到end下标结束的value值
     *
     * @param key
     * @param start
     * @param end
     * @author Flying
     * 2018年1月12日 上午9:53:59
     */
    public void trim(String key, long start, long end) {
        getListOperations().trim(key, start, end);
    }

    /**
     * 通过key返回list的长度
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午9:54:24
     */
    public Long listSize(String key) {
        return getListOperations().size(key);

    }


    /**
     * description: 获取hash大小
     *
     * @author: leiming
     * @date: 2018/6/6 16:42
     * @param: key
     * @return:
     */
    public long hashSizeNoT(String key) {
        try (Jedis jedis = pool.getResource()){
            return jedis.hlen(key);
        }

    }

    /**
     * 通过key向list头部添加字符串
     *
     * @param key
     * @param value
     * @return
     * @author Flying
     * 2018年1月12日 上午9:55:01
     */
    public Long leftPush(String key, String value) {
        return getListOperations().leftPush(key, value);

    }

    /**
     * 通过key向list头部批量添加字符串
     *
     * @param key
     * @param key values
     * @return
     * @author Flying
     * 2018年1月12日 上午9:55:01
     */
    public Long leftPushAll(String key, String... values) {
        return getListOperations().leftPushAll(key, values);
    }


    /**
     * 通过key在list指定的位置之前 添加字符串元素
     *
     * @param key
     * @param pivot
     * @param value
     * @return
     * @author Flying
     * 2018年1月12日 上午10:01:22
     */
    public Long leftPush(String key, String pivot, String value) {
        return getListOperations().leftPush(key, pivot, value);
    }

    /**
     * 通过key向list尾部添加字符串
     *
     * @param key
     * @param value
     * @return
     * @author Flying
     * 2018年1月12日 上午10:01:26
     */
    public Long rightPush(String key, String value) {
        return getListOperations().rightPush(key, value);
    }

    /**
     * 通过key向list尾部批量添加字符串
     *
     * @param key
     * @param values
     * @return
     * @author Flying
     * 2018年1月12日 上午10:02:01
     */
    public Long rightPushAll(String key, String... values) {
        return getListOperations().rightPushAll(key, values);
    }

    /**
     * 通过key在list指定的位置之后 添加字符串元素
     *
     * @param key
     * @param pivot
     * @param value
     * @return
     * @author Flying
     * 2018年1月12日 上午10:02:26
     */
    public Long rightPush(String key, String pivot, String value) {
        return getListOperations().rightPush(key, pivot, value);
    }

    /**
     * 通过key设置list指定下标位置的value
     *
     * @param key
     * @param index
     * @param value
     * @author Flying
     * 2018年1月12日 上午10:04:10
     */
    public void set(String key, long index, String value) {
        getListOperations().set(key, index, value);
    }

    /**
     * 通过key从对应的list中删除指定的count个 和 value相同的元素
     *
     * @param key
     * @param count
     * @param value
     * @return
     * @author Flying
     * 2018年1月12日 上午10:04:31
     */
    public Long remove(String key, long count, Object value) {
        return getListOperations().remove(key, count, value);
    }

    /**
     * 通过key获取list中指定下标位置的value
     *
     * @param key
     * @param index
     * @return
     * @author Flying
     * 2018年1月12日 上午10:04:55
     */
    public String index(String key, long index) {
        return getListOperations().index(key, index);
    }

    /**
     * 通过key从list的头部删除一个value,并返回该value
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午10:05:27
     */
    public String leftPop(String key) {
        return getListOperations().leftPop(key);
    }

    /**
     * 通过key从list的头部 定时删除一个value,并返回该value
     *
     * @param key
     * @param seconds
     * @return
     * @author Flying
     * 2018年1月12日 上午10:06:58
     */
    public String leftPop(String key, int seconds) {
        return getListOperations().leftPop(key, seconds, TimeUnit.SECONDS);
    }

    /**
     * 通过key从list的尾部删除一个value,并返回该value
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午10:05:36
     */
    public String rightPop(String key) {
        return getListOperations().rightPop(key);
    }

    /**
     * 通过key从list的尾部 定时删除一个value,并返回该value
     *
     * @param key
     * @param seconds
     * @return
     * @author Flying
     * 2018年1月12日 上午10:06:58
     */
    public String rightPop(String key, int seconds) {
        return getListOperations().rightPop(key, seconds, TimeUnit.SECONDS);
    }

    /**
     * 通过key从一个list的尾部删除一个value并添加到另一个list的头部,并返回该value
     *
     * @param sourceStringey
     * @param destinationStringey
     * @return
     * @author Flying
     * 2018年1月12日 上午10:11:16
     */
    public String rightPopAndLeftPush(String sourceStringey, String destinationStringey) {
        return getListOperations().rightPopAndLeftPush(sourceStringey, destinationStringey);
    }

    /**
     * 通过key从一个list的尾部定时删除一个value并添加到另一个list的头部,并返回该value
     *
     * @param sourceStringey
     * @param destinationStringey
     * @param sourceStringey
     * @param destinationStringey
     * @return
     * @author Flying
     * 2018年1月12日 上午10:11:20
     */
    public String rightPopAndLeftPush(String sourceStringey, String destinationStringey, int seconds) {
        return getListOperations().rightPopAndLeftPush(sourceStringey, destinationStringey, seconds, TimeUnit.SECONDS);
    }

    /*****************************************************
     ***********************Set**************************
     *****************************************************/

    /**
     * 通过key向指定的set中添加value
     *
     * @param key
     * @param values
     * @return
     * @author Flying
     * 2018年1月12日 上午10:57:14
     */
    public Long add(String key, String... values) {
        return getSetOperations().add(key, values);
    }


    /**
     * 通过key删除set中对应的value值
     *
     * @param key
     * @param values
     * @return
     * @author Flying
     * 2018年1月12日 上午10:57:59
     */
    public Long remove(String key, Object... values) {
        return getSetOperations().remove(key, values);
    }

    /**
     * 通过key随机删除一个set中的value并返回该值
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午11:01:02
     */
    public String pop(String key) {
        return getSetOperations().pop(key);
    }

    /**
     * 通过key将set中的value移除并添加到第二个set中
     *
     * @param key
     * @param value
     * @param destKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:01:37
     */
    public Boolean move(String key, String value, String destKey) {
        return getSetOperations().move(key, value, destKey);
    }

    /**
     * 通过key获取set中value的个数
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午11:02:13
     */
    public Long getSetsize(String key) {
        return getSetOperations().size(key);
    }

    /**
     * 通过key判断value是否是set中的元素
     *
     * @param key
     * @param o
     * @return
     * @author Flying
     * 2018年1月12日 上午10:36:51
     */
    public Boolean isMember(String key, Object o) {
        return getSetOperations().isMember(key, o);
    }

    /**
     * 通过key获取两个set中的交集
     *
     * @param key
     * @param otherKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:03:18
     */
    public Set<String> intersect(String key, String otherKey) {
        return getSetOperations().intersect(key, otherKey);
    }

    /**
     * 通过key获取指定set中的交集
     *
     * @param key
     * @param otherKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:03:40
     */
    public Set<String> intersect(String key, String... otherKey) {
        return getSetOperations().intersect(key, Arrays.asList(otherKey));
    }


    public Set<String> intersect(String key, Collection<String> otherKeys) {
        return getSetOperations().intersect(key, otherKeys);
    }


    /**
     * 通过key获取指定set中的交集 并将结果存入新的set中
     *
     * @param key
     * @param otherKey
     * @param destKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:04:06
     */
    public Long intersectAndStore(String key, String otherKey, String destKey) {
        return getSetOperations().intersectAndStore(key, otherKey, destKey);
    }

    /**
     * @param key
     * @param otherKeys
     * @param destKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:04:38
     */
    public Long intersectAndStore(String key, String destKey, String... otherKeys) {
        return getSetOperations().intersectAndStore(key, Arrays.asList(otherKeys), destKey);
    }

    public Long intersectAndStore(String key, String destKey, Collection<String> otherKeys) {
        return getSetOperations().intersectAndStore(key, otherKeys, destKey);
    }

    /**
     * 通过key返回所有set的并集
     *
     * @param key
     * @param otherKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:06:27
     */
    public Set<String> union(String key, String otherKey) {
        return getSetOperations().union(key, otherKey);
    }

    /**
     * 通过key返回所有set的并集
     *
     * @param key
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午11:06:27
     */
    public Set<String> union(String key, String... otherKeys) {
        return getSetOperations().union(key, Arrays.asList(otherKeys));
    }

    public Set<String> union(String key, Collection<String> otherKeys) {
        return getSetOperations().union(key, otherKeys);
    }

    /**
     * 通过key返回所有set的并集,并存入到新的set中
     *
     * @param key
     * @param otherKey
     * @param destKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:16:07
     */
    public Long unionAndStore(String key, String otherKey, String destKey) {
        return getSetOperations().unionAndStore(key, otherKey, destKey);
    }

    /**
     * 通过key返回所有set的并集,并存入到新的set中
     *
     * @param key
     * @param key
     * @param destKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:16:14
     */
    public Long unionAndStore(String key, String destKey, String... otherKey) {
        return getSetOperations().unionAndStore(key, Arrays.asList(otherKey), destKey);
    }

    public Long unionAndStore(String key, String destKey, Collection<String> otherKey) {
        return getSetOperations().unionAndStore(key, otherKey, destKey);
    }

    /**
     * 通过key获取set中的差集
     *
     * @param key
     * @param otherKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:17:03
     */
    public Set<String> difference(String key, String otherKey) {
        return getSetOperations().difference(key, otherKey);
    }

    /**
     * 通过key获取set中的差集
     *
     * @param key
     * @param otherKeys
     * @return
     * @author Flying
     * 2018年1月12日 上午11:17:43
     */
    public Set<String> difference(String key, String... otherKeys) {
        return getSetOperations().difference(key, Arrays.asList(otherKeys));
    }

    public Set<String> difference(String key, Collection<String> otherKeys) {
        return getSetOperations().difference(key, otherKeys);
    }

    /**
     * 通过key获取set中的差集并存入到另一个key中
     *
     * @param key
     * @param otherKey
     * @param destKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:18:15
     */
    public Long differenceAndStore(String key, String otherKey, String destKey) {
        return getSetOperations().differenceAndStore(key, otherKey, destKey);
    }

    /**
     * 通过key获取set中的差集并存入到另一个key中
     *
     * @param key
     * @param otherKeys
     * @param destKey
     * @return
     * @author Flying
     * 2018年1月12日 上午11:18:41
     */
    public Long differenceAndStore(String key, String destKey, String... otherKeys) {
        return getSetOperations().differenceAndStore(key, Arrays.asList(otherKeys), destKey);
    }

    public Long differenceAndStore(String key, String destKey, Collection<String> otherKeys) {
        return getSetOperations().differenceAndStore(key, otherKeys, destKey);
    }

    /**
     * 通过key获取set中所有的value
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午11:19:26
     */
    public Set<String> members(String key) {
        return getSetOperations().members(key);
    }

    /**
     * 通过key获取set中随机的value,不删除元素
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午11:19:31
     */
    public String randomMember(String key) {
        return getSetOperations().randomMember(key);
    }


    /*****************************************************
     ***********************有序Set**************************
     *****************************************************/
    /**
     * 通过key向zset中添加value,score,其中score就是用来排序的
     *
     * @param key
     * @param value
     * @param score
     * @return
     * @author Flying
     * 2018年1月12日 上午11:55:39
     */
    public Boolean add(String key, String value, double score) {
        return getZSetOperations().add(key, value, score);
    }

    /**
     * 通过key删除在zset中指定的value
     *
     * @param key
     * @param values
     * @return
     * @author Flying
     * 2018年1月12日 下午1:53:34
     */
    public Long zsetRemove(String key, Object... values) {
        return getZSetOperations().remove(key, values);
    }

    /**
     * 通过key增加该zset中value的score的值
     *
     * @param key
     * @param value
     * @param delta
     * @return
     * @author Flying
     * 2018年1月12日 下午1:54:14
     */
    public Double incrementScore(String key, String value, double delta) {
        return getZSetOperations().incrementScore(key, value, delta);
    }

    /**
     * 通过key返回zset中value的排名   下标从小到大排序
     *
     * @param key
     * @param o
     * @return
     * @author Flying
     * 2018年1月12日 下午1:54:38
     */
    public Long rank(String key, Object o) {
        return getZSetOperations().rank(key, o);
    }

    /**
     * 通过key返回zset中value的排名   下标从大到小排序
     *
     * @param key
     * @param o
     * @return
     * @author Flying
     * 2018年1月12日 下午1:55:40
     */
    public Long reverseRank(String key, Object o) {
        return getZSetOperations().reverseRank(key, o);
    }

    /**
     * 通过key将获取score从start到end中zset的value
     *
     * @param key
     * @param start
     * @param end
     * @return
     * @author Flying
     * 2018年1月12日 下午1:57:43
     */
    public Set<String> zRange(String key, long start, long end) {
        return getZSetOperations().range(key, start, end);
    }

    /**
     * 通过key返回指定score内zset中的value
     *
     * @param key
     * @param min
     * @param max
     * @return
     * @author Flying
     * 2018年1月12日 下午1:59:34
     */
    public Set<String> rangeByScore(String key, double min, double max) {
        return getZSetOperations().rangeByScore(key, min, max);
    }

    /**
     * @param key
     * @param min
     * @param max
     * @param offset
     * @param count
     * @return
     * @author Flying
     * 2018年1月12日 下午2:26:57
     */
    public Set<String> rangeByScore(String key, double min, double max, long offset, long count) {
        return getZSetOperations().rangeByScore(key, min, max, offset, count);
    }

    /**
     * 通过key将获取score从start到end中zset的value
     *
     * @param key
     * @param start
     * @param end
     * @return
     * @author Flying
     * 2018年1月12日 下午2:31:36
     */
    public Set<String> reverseRange(String key, long start, long end) {
        return getZSetOperations().reverseRange(key, start, end);
    }

    /**
     * 通过key返回指定score内zset中的value
     *
     * @param key
     * @param min
     * @param max
     * @return
     * @author Flying
     * 2018年1月12日 下午2:32:15
     */
    public Set<String> reverseRangeByScore(String key, double min, double max) {
        return getZSetOperations().reverseRangeByScore(key, min, max);
    }

    /**
     * 返回指定区间内zset中value的数量
     *
     * @param key
     * @param min
     * @param max
     * @return
     * @author Flying
     * 2018年1月12日 下午2:33:12
     */
    public Long count(String key, double min, double max) {
        return getZSetOperations().count(key, min, max);
    }

    /**
     * 通过key返回zset中的value个数
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 下午2:33:47
     */
    public Long zSetSize(String key) {
        return getZSetOperations().size(key);
    }

    /**
     * 通过key获取zset中value的score值
     *
     * @param key
     * @param o
     * @return
     * @author Flying
     * 2018年1月12日 下午2:35:13
     */
    public Double score(String key, Object o) {
        return getZSetOperations().score(key, o);
    }

    /**
     * 通过key删除给定区间内的元素
     *
     * @param key
     * @param start
     * @param end
     * @return
     * @author Flying
     * 2018年1月12日 下午2:36:45
     */
    public Long removeRange(String key, long start, long end) {
        return getZSetOperations().removeRange(key, start, end);
    }

    /**
     * 通过key删除指定score内的元素
     *
     * @param key
     * @param min
     * @param max
     * @return
     * @author Flying
     * 2018年1月12日 下午2:37:10
     */
    public Long removeRangeByScore(String key, double min, double max) {
        return getZSetOperations().removeRangeByScore(key, min, max);
    }


    /***************************Common******************************/
    /**
     * 判断key是否存在
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月16日 下午1:42:49
     */
    public Boolean exists(String key,Integer... index) {
        Boolean value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            value = jedis.exists(key);
        } 
        return value;
    }

    /**
     * 通过key删除value
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月16日 下午1:42:49
     */
    public Long del(String key,Integer... index) {
        Long value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            value = jedis.del(key);
        } 
        return value;
    }


    /**
     * 自增
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月16日 下午1:42:49
     */
    public Long incrementNoRollBack(String key, long data,Integer... index) {

        Long value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            value = jedis.incrBy(key, data);
        } 
        return value;

    }

    /**
     * 自增 含过期时间
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月16日 下午1:42:49
     */
    public Long incrementNoRollBackExpire(String key, Long data, Integer second,Integer... index) {

        Long value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            value = jedis.incrBy(key, data);
            jedis.expire(key,second);
        } 
        return value;

    }

    /**
     * 组 自增
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月16日 下午1:42:49
     */
    public Long incrementNoRollBack(String group, String key, long data,Integer... index) {
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
        	return  jedis.hincrBy(group.getBytes(), key.getBytes(), data);
        } 
    }


    /**
     * 写入String类型 key value
     *
     * @param key
     * @param value
     * @author Flying
     * 2018年1月25日 下午8:47:57
     */
    public void setNoRollBack(String key, String value, Integer... index) {
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            jedis.set(key, value);
        } 
    }


    public void setexNoRollBack(String key, String value, int seconds, Integer... index) {
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            jedis.setex(key, seconds, value);
        } 
    }


    /**
     * 获取过期剩余时间
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月25日 下午8:47:27
     */
    public Long getTTL(String key,Integer...index) {
        Long value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            value = jedis.ttl(key);
        } 
        return value;
    }

    /**
     * 非事务性插入redis
     *
     * @param key
     * @return
     * @author Flying 2018年1月25日 下午8:47:27
     */
    public void jedisSet(String key, String value, int second,Integer... index) {
        try (Jedis jedis = pool.getResource()){
        	select(jedis,index);
            value = jedis.set(key, value);
            jedis.expire(key, second);
        } 
    }

    /**
     * @author: revelin
     * @param key
     * @Date:  上午11:54 18-5-9
     * @Description: redis队列 左弹出
     *
     **/
    public String jedisLpop(String key,Integer... index){
        String value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis, index);
            value = jedis.lpop(key);
        }
        return value;
    }

    /**
     * @author: revelin
     * @param key
     * @Date:  上午11:54 18-5-9
     * @Description: redis队列 右入
     *
     **/
    public void jedisRpush(String key,String value,Integer... index){
        try(Jedis jedis = pool.getResource()) {
        	select(jedis, index);
            jedis.rpush(key,value);
        }
    }

    /**
     * @author: revelin
     * @param key
     * @Date:  上午11:54 18-5-9
     * @Description: redis队列 左弹出
     *
     **/
    public Long jedisLLen(String key,Integer... index){
        Long value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis, index);
            value = jedis.llen(key);
        } 
        return value;
    }

    /**
     * @author: revelin
     * @param key
     * @Date:  上午11:54 18-5-9
     * @Description: redis队列值
     *
     **/
    public List<String> jedisLRange(String key, Long start, Long end, Integer... index){
        List<String> value = null;
        try (Jedis jedis = pool.getResource()){
            select(jedis, index);
            value = jedis.lrange(key,start,end);
        }
        return value;
    }

    /**
     * @author: revelin
     * @param key
     * @Date:  上午11:54 18-5-9
     * @Description: redis队列值
     *
     **/
    public List<String> jedisLRangeAll(String key, Integer... index){
        List<String> value = this.jedisLRange(key,0L,-1L);
        return value;
    }


    /**
     * set 查询是否包含key和value
     *
     * @param key
     * @return
     * 2018年1月16日 下午1:42:49
     */
    public Boolean jedisIsMember(String key, Object data,Integer... index) {

        Boolean value = null;
        try (Jedis jedis = pool.getResource()){
        	select(jedis, index);
            value = jedis.sismember(key, String.valueOf(data));
        } 
        return value;
    }

    /**
     * @author: revelin
     * @param key
     * @Date:  上午10:11 18-5-10
     * @Description:
     * 将 key 的值设为 value ，当且仅当 key 不存在。

       若给定的 key 已经存在，则 SETNX 不做任何动作。
     *
     **/
    public Long jedisSetnx(String key, String value,Integer... index) {
        Long result = 0L;
        try (Jedis jedis = pool.getResource()){
        	select(jedis, index);
            result = jedis.setnx(key, value);
            jedis.expire(key,60);
        }
        return result;
    }

    public Long jedisSetnx(String key, String value,Integer seconds,Integer index) {
        Long result = 0L;
        try (Jedis jedis = pool.getResource()){
            select(jedis, index);
            result = jedis.setnx(key, value);
            if(!ParametersUtil.isNull(seconds)) {
                jedis.expire(key, 60);
            }
        }
        return result;
    }

    /**
     * @author: revelin
     * @param key
     * @Date:  上午10:11 18-5-10
     * @Description:
     * 添加数据到集合中
     *
     **/
    public Long jedisSadd(String key, String value,Integer... index) {
        Long result = 0L;
        try (Jedis jedis = pool.getResource()){
        	select(jedis, index);
            result = jedis.sadd(key, value);
        } 
        return result;
    }

    /**
     * @param key
     * @author: revelin
     * @Date: 上午10:11 18-5-10
     * @Description: 添加数据到集合中
     **/
    public Long jedisSRem(String key, String value, Integer... index) {
        Long result = 0L;
        try (Jedis jedis = pool.getResource()) {
            select(jedis, index);
            result = jedis.srem(key, value);
        }
        return result;
    }

    /**
     * @author: revelin
     * @Date:  下午4:25 18-6-6
     * @Description: 哈希增加
     *
     **/
    public Long jedisHset(String key, String field, String value, Integer... index) {
        Long result = 0L;
        try (Jedis jedis = pool.getResource()) {
            select(jedis, index);
            result = jedis.hset(key, field, value);
        }
        return result;
    }


    /**
     * @author: revelin
     * @Date:  下午4:25 18-6-6
     * @Description: 哈希 获取
     *
     **/
    public String jedisHget(String key, String field, Integer... index) {
        String result = "";
        try (Jedis jedis = pool.getResource()) {
            select(jedis, index);
            result = jedis.hget(key, field);
        }
        return result;
    }

    /**
     * @author: revelin
     * @Date:  下午4:25 18-6-6
     * @Description: 哈希 是否存在
     *
     **/
    public Boolean jedisHexist(String key, String field, Integer... index) {
        Boolean result = false;
        try (Jedis jedis = pool.getResource()) {
            select(jedis, index);
            result = jedis.hexists(key, field);
        }
        return result;
    }

    /**
     * @author: revelin
     * @Date:  下午4:25 18-6-6
     * @Description: 哈希 删除
     *
     **/
    public Long jedisHdel(String key, String field, Integer... index) {
        Long result = 0L;
        try (Jedis jedis = pool.getResource()) {
            select(jedis, index);
            result = jedis.hdel(key, field);
        }
        return result;
    }


    public Jedis getJedisInstance(){
        Jedis jedis = pool.getResource();
        return jedis;
    }



    /**
     * 获取值
     *
     * @param key
     * @return
     * @author Flying
     * 2018年1月12日 上午8:58:13
     */
    public String get(String key) {
        String value = null;
        try (Jedis jedis = pool.getResource()) {
            value = jedis.get(key);
        }
        return value;
    }


    /**
     * 获取Hash集合
     *
     * @param group
     * @return
     * @author Flying
     * 2018年1月12日 上午8:58:13
     */
    public Map<String, String> getHashAll(String group) {
        Map<String, String> value = null;
        try (Jedis jedis = pool.getResource()) {
            value = jedis.hgetAll(group);
        }
        return value;
    }


    /**
     * 获取Hash集合
     *
     * @param group
     * @return
     * @author Flying
     * 2018年1月12日 上午8:58:13
     */
    public Long hDel(String group,String key) {
        try (Jedis jedis = pool.getResource()) {
            return jedis.hdel(group,key);
        }
    }

    /**
     * description:比对值否一致并且删除此key
     * @author: Flying
     * @date: 2018-08-30 14:18
     * @param: null
     * @return
     */
    public Boolean comparisonValueAndDelete(String key,String comparisonValue) {
        Boolean result= false;
        try (Jedis jedis = pool.getResource()){
            String value = jedis.get(key);
            if(value != null && value.equals(comparisonValue)){
                result = true;
                jedis.del(key);
            }

        }
        return result;
    }



    /**
     * @author: revelin
     * @Param
     * @Date:  下午1:45 18-5-22
     * @Description:
     *
     **/
    public Boolean volidateIdempotency(String preKey){
        if(this.jedisSetnx(preKey,"1") == 0){
            return false;
        }
        return true;
    }

    private void select(Jedis jedis,Integer... index){
    	if(index!=null&&index.length>1){
    		throw new RuntimeException("index参数超长");
    	}
    	if(index!=null&&index.length==1){
			String result= jedis.select(index[0]);
			if(result == null || !"OK".equals(result.toUpperCase())){
				throw new RuntimeException("切换Redis数据库异常");
			}
    	}
    }

}